##*********************************************************************************
#  Copyright(C), TMR.Nic @ AIMCNT
#  FileName:  NasAutoInstaller
#  Author:  TMR.Nic
#  Version:  2.0
#  Date:  2022-11-23
#  Description:  
#     1. 用于实验室NAS的PC客户端安装与配置，简化原有的操作流程
#     2. 程序需要管理员权限（前期用户手动管理员方式启动，后期调用UAC控制获取权限）
#  History:
#     2022-11-23: 创建工程完成软件界面、按键回调、打开关闭等功能，确定基本操作逻辑
#     2022-11-24: 完善后续功能，加入planet文件替换，服务启动，网络注册，ID查询等功能；
#                 修复软件完成安装会重复安装的BUG；
#                 完成ID获取与表单填写（移动端）全部功能。
#     2022-11-25: 完成全部表单功能，修改调试信息，1.0版本基本完成
#     2022-12-05: 加入管理员身份启动，修复无法向系统盘复制planet文件的问题
#     2023-02-05: 用户注册信息将通过ECS服务器发送给管理员，删除原有数据提交对话框
#  
##*********************************************************************************

from PyQt6.QtWidgets import QApplication, QMainWindow, QDialog
from NasAutoWnd import Ui_MainWindow
import sys, os, subprocess
import win32api, win32con
import pyperclip
from PIL import ImageQt
import qrcode
from CallAdminDlg import Ui_Dialog
from Send2AdminDlg import Send2AdminDlg
from pyuac import main_requires_admin

# ================ Win32 CMD  ==================
def WinCMD(cmd):
    # os.system(cmd)
    return subprocess.getoutput(cmd)

# ================ Info Dlg   ==================
def Toast(title, content):
    win32api.MessageBox(None,content,title,win32con.MB_OK)

# ================ 检查已安装的软件  ================
def checkZeroMsi():
    zeroInstPath = 'C:\\Program Files (x86)\\ZeroTier\\One\\zerotier_desktop_ui.exe'
    return os.path.exists(zeroInstPath)         # 返回安装状态

# ================ 安装MSI软件  =================
def installZero():
    None

# ================ 发送ID对话框类 ================
#  CallAdminShowDlg 向管理员提交ID信息
# ================================================
class CallAdminShowDlg(QDialog, Ui_Dialog):
    def __init__(self):
        super(CallAdminShowDlg, self).__init__()    
        self.setupUi(self)
        self.TableURL = 'https://f.wps.cn/w/xxxxxxxx/'

    # 打开网页版提交表单界面
    def OpenTable(self):
        WinCMD('start '+self.TableURL)

# ================ 主窗口管理类 ================
#  NasAutoWnd 主窗口定义与信号响应
#  1 .实现各个按键的功能
#  2 .管理程序逻辑
# ==============================================
class NasAutoWnd(QMainWindow, Ui_MainWindow):
    def __init__(self):
        self.PATH = ""      # 程序路径
        self.bool_instState = checkZeroMsi()   # 检查Zero是否已经安装
        self.ProjectURL = 'https://gitee.com/tmrnic/nas-auto-installer'
        super(NasAutoWnd, self).__init__()    
        self.setupUi(self)
    
    # 0 一键部署
    def oneStepOperation(self):
        Toast('信息提示', '此功能尚未完成开发')

    # 1 安装软件
    def NAS_Install(self):
        if not self.bool_instState:     # 没有安装才进行安装
            zeroMsiPath = self.PATH + '\\ZeroTierOne.msi'
            if os.path.exists(zeroMsiPath):         # 检查是否有安装文件
                win32api.MessageBox(None,"找到文件了o(*￣▽￣*)ブ","Debug",win32con.MB_OK)       # Win32Dlg是阻塞的
                WinCMD('msiexec.exe /i "'+zeroMsiPath+'"')  # 开始安装文件
            else:
                win32api.MessageBox(None,"没找到文件(T_T)","Debug",win32con.MB_OK)
                # 开始下载文件
        else:                           # 提示已安装
            Toast('信息提示', 'ZeroTierOne已经安装,,ԾㅂԾ,,')

    # 2 替换文件
    def NAS_Replace(self):
        planetPath = self.PATH + '\\planet'
        cmd = 'copy /Y "'+planetPath+'" "C:\\ProgramData\\ZeroTier\\One"'       # CMD
        #cmd = 'copy-item "'+planetPath+'" -Destination "C:\\ProgramData\\ZeroTier\\one"'        # PS
        res = WinCMD(cmd)   # 直接覆盖复制
        Toast('信息提示','已成功替换planet文件O(∩_∩)O')

    # 3 启动服务
    def NAS_StartService(self):
        res = WinCMD('net start ZeroTierOneService')      # 启动服务
        #res = WinCMD('"C:\\Program Files (x86)\\ZeroTier\\One\\zerotier-cli.bat" join 123456789abcdef')
        res = WinCMD(' C:\ProgramData\ZeroTier\One\zerotier-one_x64.exe join 123456789abcdef')
        #res = '200 join ok\n'
        if res=='200 join ok':              # 检查注册结果
            Toast('信息提示','注册成功！φ(゜▽゜*)♪')
        else:
            Toast('信息提示','注册失败！φ(゜▽゜*)♪')

    # 4.获取ID并发送
    #   目前采用PC端与移动端手动提交信息，后期可以用TCPIP协议发送相关内容到内网服务器
    def NAS_SendID(self):
        res = WinCMD('"C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat" status')
        res = res[0:-1]         # 删除最后的/r或/n
        pyperclip.copy(res)
        img_IDQ = qrcode.make(res)
        pix_IDQ = ImageQt.toqpixmap(img_IDQ)
        #Toast('信息提示',res+"\n以上信息已复制到剪贴板，直接发送给Admin审核")
        #Dlg_callAdmin = CallAdminShowDlg()          # 打开ID发送方式显示对话框
        #Dlg_callAdmin.label_IDQ.setPixmap(pix_IDQ)
        #Dlg_callAdmin.label_IDQ.setScaledContents(True)
        #Dlg_callAdmin.exec()

        Dlg_send2admin = Send2AdminDlg()
        Dlg_send2admin.init()
        Dlg_send2admin.write_id(res)
        Dlg_send2admin.exec()
        
    # 8 退出软件
    def exit(self):
        self.close()

    # 9 联系开发组
    def callAdmin(self):
        Toast('信息提示', "即将打开项目网站，")
        WinCMD('start '+self.ProjectURL)

# ================== 全局变量 ================
PATH = ""

# ================ 主函数启动 ================
@main_requires_admin
def main():
    app = QApplication(sys.argv)
    MainWindow = NasAutoWnd()
    MainWindow.PATH = os.getcwd()
    MainWindow.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()